#include "FLOW_core/flow_core_pch.h"
#include "FLOW_core/StrIdMgr.h"

namespace CORE
{
	//=========================================================================

	CStrId::CStrId( )
		: m_hash_id( 0 )
		, m_b_is_valid( false )
	{
	}

	//=========================================================================

	CStrId::CStrId( const CStrId& ar_strid )
		: m_hash_id( ar_strid.m_hash_id )
		, m_b_is_valid( m_b_is_valid )
	{
		if( m_b_is_valid )
			STRIDMGR->AddString( m_hash_id );
	}

	//=========================================================================

	CStrId::CStrId( const char* apsz_string_id )
		: m_hash_id( 0 )
		, m_b_is_valid( false )
	{
		m_b_is_valid = STRIDMGR->AddString( apsz_string_id, m_hash_id );
	}

	//=========================================================================

	CStrId::CStrId( hashid_t& ar_hashid )
		: m_hash_id( ar_hashid )
		, m_b_is_valid( false )
	{
		m_b_is_valid = STRIDMGR->GetString( ar_hashid ) != NULL;
	}

	//=========================================================================

	CStrId::~CStrId( )
	{
		Reset( );
	}

	//=========================================================================

	void CStrId::Reset( void )
	{
		if( m_b_is_valid )
			STRIDMGR->ReleaseString( m_hash_id );
		m_hash_id = 0;
		m_b_is_valid = false;
	}

	//=========================================================================

	CStrId& CStrId::operator = ( const CStrId& ar_strid )
	{
		m_hash_id = ar_strid.m_hash_id;
		m_b_is_valid = ar_strid.m_b_is_valid;
		if( m_b_is_valid )
			STRIDMGR->AddString( m_hash_id );

		return *this;
	}

	//=========================================================================

	void CStrId::Set( const char_t* apsz_string_id )
	{
		if( m_b_is_valid )
			STRIDMGR->ReleaseString( m_hash_id );

		m_b_is_valid = STRIDMGR->AddString( apsz_string_id, m_hash_id );
	}

	//=========================================================================

	void CStrId::Set( hashid_t& ar_hashid )
	{
		if( m_b_is_valid )
			STRIDMGR->ReleaseString( m_hash_id );

		m_hash_id = ar_hashid;
		m_b_is_valid = STRIDMGR->GetString( m_hash_id ) != NULL;
	}

	//=========================================================================

	hashid_t CStrId::Hash( void ) const
	{
		return m_hash_id;
	}

	//=========================================================================

	const char_t* CStrId::String( void )
	{
		return STRIDMGR->GetString( m_hash_id );
	}

	//=========================================================================

	const char_t* CStrId::c_str( void )
	{
		return String( );
	}

	//=========================================================================

	bool_t CStrId::operator == ( const CStrId& ar_strid ) const
	{
		return Equals( ar_strid );
	}

	//=========================================================================

	bool_t CStrId::Equals( const CStrId& ar_strid ) const
	{
		return m_hash_id == ar_strid.m_hash_id;
	}

	//=========================================================================

} //namespace CORE